home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 October: Mac OS SDK / Dev.CD Oct 97 SDK1.toast / Development Kits (Disc 1) / Interfaces&Libraries / Universal / Interfaces / CIncludes / ImageCodec.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-12  |  15.7 KB  |  496 lines  |  [TEXT/MPS ]

  1. /*
  2.      File:        ImageCodec.h
  3.  
  4.      Contains:    QuickTime Interfaces.
  5.  
  6.      Version:    Technology:    QuickTime 2.5
  7.                  Release:    Universal Interfaces 3.0.1
  8.  
  9.      Copyright:    © 1990-1997 by Apple Computer, Inc., all rights reserved
  10.  
  11.      Bugs?:        Please include the the file and version information (from above) with
  12.                  the problem description.  Developers belonging to one of the Apple
  13.                  developer programs can submit bug reports to:
  14.  
  15.                      devsupport@apple.com
  16.  
  17. */
  18. #ifndef __IMAGECODEC__
  19. #define __IMAGECODEC__
  20.  
  21. #ifndef __TYPES__
  22. #include <Types.h>
  23. #endif
  24. #ifndef __QUICKDRAW__
  25. #include <Quickdraw.h>
  26. #endif
  27. #ifndef __IMAGECOMPRESSION__
  28. #include <ImageCompression.h>
  29. #endif
  30. #ifndef __COMPONENTS__
  31. #include <Components.h>
  32. #endif
  33.  
  34.  
  35.  
  36. #if PRAGMA_ONCE
  37. #pragma once
  38. #endif
  39.  
  40. #ifdef __cplusplus
  41. extern "C" {
  42. #endif
  43.  
  44. #if PRAGMA_IMPORT
  45. #pragma import on
  46. #endif
  47.  
  48. #if PRAGMA_STRUCT_ALIGN
  49.     #pragma options align=mac68k
  50. #elif PRAGMA_STRUCT_PACKPUSH
  51.     #pragma pack(push, 2)
  52. #elif PRAGMA_STRUCT_PACK
  53.     #pragma pack(2)
  54. #endif
  55.  
  56. /*    codec capabilities flags    */
  57.  
  58. enum {
  59.     codecCanScale                = 1L << 0,
  60.     codecCanMask                = 1L << 1,
  61.     codecCanMatte                = 1L << 2,
  62.     codecCanTransform            = 1L << 3,
  63.     codecCanTransferMode        = 1L << 4,
  64.     codecCanCopyPrev            = 1L << 5,
  65.     codecCanSpool                = 1L << 6,
  66.     codecCanClipVertical        = 1L << 7,
  67.     codecCanClipRectangular        = 1L << 8,
  68.     codecCanRemapColor            = 1L << 9,
  69.     codecCanFastDither            = 1L << 10,
  70.     codecCanSrcExtract            = 1L << 11,
  71.     codecCanCopyPrevComp        = 1L << 12,
  72.     codecCanAsync                = 1L << 13,
  73.     codecCanMakeMask            = 1L << 14,
  74.     codecCanShift                = 1L << 15,
  75.     codecCanAsyncWhen            = 1L << 16,
  76.     codecCanShieldCursor        = 1L << 17,
  77.     codecCanManagePrevBuffer    = 1L << 18,
  78.     codecHasVolatileBuffer        = 1L << 19,
  79.     codecWantsRegionMask        = 1L << 20,
  80.     codecImageBufferIsOnScreen    = 1L << 21,
  81.     codecWantsDestinationPixels    = 1L << 22
  82. };
  83.  
  84.  
  85. struct CodecCapabilities {
  86.     long                             flags;
  87.     short                             wantedPixelSize;
  88.     short                             extendWidth;
  89.     short                             extendHeight;
  90.     short                             bandMin;
  91.     short                             bandInc;
  92.     short                             pad;
  93.     unsigned long                     time;
  94. };
  95. typedef struct CodecCapabilities CodecCapabilities;
  96.  
  97. /*    codec condition flags    */
  98.  
  99. enum {
  100.     codecConditionFirstBand        = 1L << 0,
  101.     codecConditionLastBand        = 1L << 1,
  102.     codecConditionFirstFrame    = 1L << 2,
  103.     codecConditionNewDepth        = 1L << 3,
  104.     codecConditionNewTransform    = 1L << 4,
  105.     codecConditionNewSrcRect    = 1L << 5,
  106.     codecConditionNewMask        = 1L << 6,
  107.     codecConditionNewMatte        = 1L << 7,
  108.     codecConditionNewTransferMode = 1L << 8,
  109.     codecConditionNewClut        = 1L << 9,
  110.     codecConditionNewAccuracy    = 1L << 10,
  111.     codecConditionNewDestination = 1L << 11,
  112.     codecConditionFirstScreen    = 1L << 12,
  113.     codecConditionDoCursor        = 1L << 13,
  114.     codecConditionCatchUpDiff    = 1L << 14,
  115.     codecConditionMaskMayBeChanged = 1L << 15,
  116.     codecConditionToBuffer        = 1L << 16,
  117.     codecConditionCodecChangedMask = 1L << 31
  118. };
  119.  
  120.  
  121.  
  122. enum {
  123.     codecInfoResourceType        = FOUR_CHAR_CODE('cdci'),        /* codec info resource type */
  124.     codecInterfaceVersion        = 2                                /* high word returned in component GetVersion */
  125. };
  126.  
  127. struct CDSequenceDataSource {
  128.     long                             recordSize;
  129.  
  130.     void *                            next;
  131.  
  132.     ImageSequence                     seqID;
  133.     ImageSequenceDataSource         sourceID;
  134.     OSType                             sourceType;
  135.     long                             sourceInputNumber;
  136.     void *                            dataPtr;
  137.     Handle                             dataDescription;
  138.     long                             changeSeed;
  139.     ICMConvertDataFormatUPP         transferProc;
  140.     void *                            transferRefcon;
  141.                                                                 /* The following fields only exist for QuickTime 2.5 and greater */
  142.     long                             dataSize;
  143. };
  144. typedef struct CDSequenceDataSource CDSequenceDataSource;
  145.  
  146. typedef CDSequenceDataSource *            CDSequenceDataSourcePtr;
  147. struct CodecCompressParams {
  148.     ImageSequence                     sequenceID;                    /* precompress,bandcompress */
  149.     ImageDescriptionHandle             imageDescription;            /* precompress,bandcompress */
  150.     Ptr                             data;
  151.     long                             bufferSize;
  152.     long                             frameNumber;
  153.     long                             startLine;
  154.     long                             stopLine;
  155.     long                             conditionFlags;
  156.     CodecFlags                         callerFlags;
  157.     CodecCapabilities *                capabilities;                /* precompress,bandcompress */
  158.     ICMProgressProcRecord             progressProcRecord;
  159.     ICMCompletionProcRecord         completionProcRecord;
  160.     ICMFlushProcRecord                 flushProcRecord;
  161.  
  162.     PixMap                             srcPixMap;                    /* precompress,bandcompress */
  163.     PixMap                             prevPixMap;
  164.     CodecQ                             spatialQuality;
  165.     CodecQ                             temporalQuality;
  166.     Fixed                             similarity;
  167.     DataRateParamsPtr                 dataRateParams;
  168.     long                             reserved;
  169.  
  170.                                                                 /* The following fields only exist for QuickTime 2.1 and greater */
  171.     UInt16                             majorSourceChangeSeed;
  172.     UInt16                             minorSourceChangeSeed;
  173.     CDSequenceDataSourcePtr         sourceData;
  174.  
  175.                                                                 /* The following fields only exit for QuickTime 2.5 and greater */
  176.     long                             preferredPacketSizeInBytes;
  177. };
  178. typedef struct CodecCompressParams CodecCompressParams;
  179.  
  180. struct CodecDecompressParams {
  181.     ImageSequence                     sequenceID;                    /* predecompress,banddecompress */
  182.     ImageDescriptionHandle             imageDescription;            /* predecompress,banddecompress */
  183.     Ptr                             data;
  184.     long                             bufferSize;
  185.     long                             frameNumber;
  186.     long                             startLine;
  187.     long                             stopLine;
  188.     long                             conditionFlags;
  189.     CodecFlags                         callerFlags;
  190.     CodecCapabilities *                capabilities;                /* predecompress,banddecompress */
  191.     ICMProgressProcRecord             progressProcRecord;
  192.     ICMCompletionProcRecord         completionProcRecord;
  193.     ICMDataProcRecord                 dataProcRecord;
  194.  
  195.     CGrafPtr                         port;                        /* predecompress,banddecompress */
  196.     PixMap                             dstPixMap;                    /* predecompress,banddecompress */
  197.     BitMapPtr                         maskBits;
  198.     PixMapPtr                         mattePixMap;
  199.     Rect                             srcRect;                    /* predecompress,banddecompress */
  200.     MatrixRecord *                    matrix;                        /* predecompress,banddecompress */
  201.     CodecQ                             accuracy;                    /* predecompress,banddecompress */
  202.     short                             transferMode;                /* predecompress,banddecompress */
  203.     ICMFrameTimePtr                 frameTime;                    /* banddecompress */
  204.     long                             reserved[1];
  205.                                                                 /* The following fields only exist for QuickTime 2.0 and greater */
  206.     SInt8                             matrixFlags;                /* high bit set if 2x resize */
  207.     SInt8                             matrixType;
  208.     Rect                             dstRect;                    /* only valid for simple transforms */
  209.                                                                 /* The following fields only exist for QuickTime 2.1 and greater */
  210.     UInt16                             majorSourceChangeSeed;
  211.     UInt16                             minorSourceChangeSeed;
  212.     CDSequenceDataSourcePtr         sourceData;
  213.  
  214.     RgnHandle                         maskRegion;
  215.  
  216.                                                                 /* The following fields only exist for QuickTime 2.5 and greater */
  217.  
  218.     OSType **                        wantedDestinationPixelTypes; /* Handle to 0-terminated list of OSTypes */
  219.  
  220.     long                             screenFloodMethod;
  221.     long                             screenFloodValue;
  222.     short                             preferredOffscreenPixelSize;
  223. };
  224. typedef struct CodecDecompressParams CodecDecompressParams;
  225.  
  226.  
  227. enum {
  228.     matrixFlagScale2x            = 1L << 7,
  229.     matrixFlagScale1x            = 1L << 6,
  230.     matrixFlagScaleHalf            = 1L << 5
  231. };
  232.  
  233.  
  234. enum {
  235.     kScreenFloodMethodNone        = 0,
  236.     kScreenFloodMethodKeyColor    = 1,
  237.     kScreenFloodMethodAlpha        = 2
  238. };
  239.  
  240. /*    codec selectors 0-127 are reserved by Apple */
  241. /*    codec selectors 128-191 are subtype specific */
  242. /*    codec selectors 192-255 are vendor specific */
  243. /*    codec selectors 256-32767 are available for general use */
  244. /*    negative selectors are reserved by the Component Manager */
  245. EXTERN_API( ComponentResult )
  246. ImageCodecGetCodecInfo            (ComponentInstance         ci,
  247.                                  CodecInfo *            info)                                FIVEWORDINLINE(0x2F3C, 0x0004, 0x0000, 0x7000, 0xA82A);
  248.  
  249. EXTERN_API( ComponentResult )
  250. ImageCodecGetCompressionTime    (ComponentInstance         ci,
  251.                                  PixMapHandle             src,
  252.                                  const Rect *            srcRect,
  253.                                  short                     depth,
  254.                                  CodecQ *                spatialQuality,
  255.                                  CodecQ *                temporalQuality,
  256.                                  unsigned long *        time)                                FIVEWORDINLINE(0x2F3C, 0x0016, 0x0001, 0x7000, 0xA82A);
  257.  
  258. EXTERN_API( ComponentResult )
  259. ImageCodecGetMaxCompressionSize    (ComponentInstance         ci,
  260.                                  PixMapHandle             src,
  261.                                  const Rect *            srcRect,
  262.                                  short                     depth,
  263.                                  CodecQ                 quality,
  264.                                  long *                    size)                                FIVEWORDINLINE(0x2F3C, 0x0012, 0x0002, 0x7000, 0xA82A);
  265.  
  266. EXTERN_API( ComponentResult )
  267. ImageCodecPreCompress            (ComponentInstance         ci,
  268.                                  CodecCompressParams *    params)                                FIVEWORDINLINE(0x2F3C, 0x0004, 0x0003, 0x7000, 0xA82A);
  269.  
  270. EXTERN_API( ComponentResult )
  271. ImageCodecBandCompress            (ComponentInstance         ci,
  272.                                  CodecCompressParams *    params)                                FIVEWORDINLINE(0x2F3C, 0x0004, 0x0004, 0x7000, 0xA82A);
  273.  
  274. EXTERN_API( ComponentResult )
  275. ImageCodecPreDecompress            (ComponentInstance         ci,
  276.                                  CodecDecompressParams * params)                            FIVEWORDINLINE(0x2F3C, 0x0004, 0x0005, 0x7000, 0xA82A);
  277.  
  278. EXTERN_API( ComponentResult )
  279. ImageCodecBandDecompress        (ComponentInstance         ci,
  280.                                  CodecDecompressParams * params)                            FIVEWORDINLINE(0x2F3C, 0x0004, 0x0006, 0x7000, 0xA82A);
  281.  
  282. EXTERN_API( ComponentResult )
  283. ImageCodecBusy                    (ComponentInstance         ci,
  284.                                  ImageSequence             seq)                                FIVEWORDINLINE(0x2F3C, 0x0004, 0x0007, 0x7000, 0xA82A);
  285.  
  286. EXTERN_API( ComponentResult )
  287. ImageCodecGetCompressedImageSize (ComponentInstance     ci,
  288.                                  ImageDescriptionHandle  desc,
  289.                                  Ptr                     data,
  290.                                  long                     bufferSize,
  291.                                  ICMDataProcRecordPtr     dataProc,
  292.                                  long *                    dataSize)                            FIVEWORDINLINE(0x2F3C, 0x0014, 0x0008, 0x7000, 0xA82A);
  293.  
  294. EXTERN_API( ComponentResult )
  295. ImageCodecGetSimilarity            (ComponentInstance         ci,
  296.                                  PixMapHandle             src,
  297.                                  const Rect *            srcRect,
  298.                                  ImageDescriptionHandle  desc,
  299.                                  Ptr                     data,
  300.                                  Fixed *                similarity)                            FIVEWORDINLINE(0x2F3C, 0x0014, 0x0009, 0x7000, 0xA82A);
  301.  
  302. EXTERN_API( ComponentResult )
  303. ImageCodecTrimImage                (ComponentInstance         ci,
  304.                                  ImageDescriptionHandle  Desc,
  305.                                  Ptr                     inData,
  306.                                  long                     inBufferSize,
  307.                                  ICMDataProcRecordPtr     dataProc,
  308.                                  Ptr                     outData,
  309.                                  long                     outBufferSize,
  310.                                  ICMFlushProcRecordPtr     flushProc,
  311.                                  Rect *                    trimRect,
  312.                                  ICMProgressProcRecordPtr  progressProc)                    FIVEWORDINLINE(0x2F3C, 0x0024, 0x000A, 0x7000, 0xA82A);
  313.  
  314. EXTERN_API( ComponentResult )
  315. ImageCodecRequestSettings        (ComponentInstance         ci,
  316.                                  Handle                 settings,
  317.                                  Rect *                    rp,
  318.                                  ModalFilterUPP         filterProc)                            FIVEWORDINLINE(0x2F3C, 0x000C, 0x000B, 0x7000, 0xA82A);
  319.  
  320. EXTERN_API( ComponentResult )
  321. ImageCodecGetSettings            (ComponentInstance         ci,
  322.                                  Handle                 settings)                            FIVEWORDINLINE(0x2F3C, 0x0004, 0x000C, 0x7000, 0xA82A);
  323.  
  324. EXTERN_API( ComponentResult )
  325. ImageCodecSetSettings            (ComponentInstance         ci,
  326.                                  Handle                 settings)                            FIVEWORDINLINE(0x2F3C, 0x0004, 0x000D, 0x7000, 0xA82A);
  327.  
  328. EXTERN_API( ComponentResult )
  329. ImageCodecFlush                    (ComponentInstance         ci)                                    FIVEWORDINLINE(0x2F3C, 0x0000, 0x000E, 0x7000, 0xA82A);
  330.  
  331. EXTERN_API( ComponentResult )
  332. ImageCodecSetTimeCode            (ComponentInstance         ci,
  333.                                  void *                    timeCodeFormat,
  334.                                  void *                    timeCodeTime)                        FIVEWORDINLINE(0x2F3C, 0x0008, 0x000F, 0x7000, 0xA82A);
  335.  
  336. EXTERN_API( ComponentResult )
  337. ImageCodecIsImageDescriptionEquivalent (ComponentInstance  ci,
  338.                                  ImageDescriptionHandle  newDesc,
  339.                                  Boolean *                equivalent)                            FIVEWORDINLINE(0x2F3C, 0x0008, 0x0010, 0x7000, 0xA82A);
  340.  
  341. EXTERN_API( ComponentResult )
  342. ImageCodecNewMemory                (ComponentInstance         ci,
  343.                                  Ptr *                    data,
  344.                                  Size                     dataSize,
  345.                                  long                     dataUse,
  346.                                  ICMMemoryDisposedUPP     memoryGoneProc,
  347.                                  void *                    refCon)                                FIVEWORDINLINE(0x2F3C, 0x0014, 0x0011, 0x7000, 0xA82A);
  348.  
  349. EXTERN_API( ComponentResult )
  350. ImageCodecDisposeMemory            (ComponentInstance         ci,
  351.                                  Ptr                     data)                                FIVEWORDINLINE(0x2F3C, 0x0004, 0x0012, 0x7000, 0xA82A);
  352.  
  353. EXTERN_API( ComponentResult )
  354. ImageCodecHitTestData            (ComponentInstance         ci,
  355.                                  ImageDescriptionHandle  desc,
  356.                                  void *                    data,
  357.                                  Size                     dataSize,
  358.                                  Point                     where,
  359.                                  Boolean *                hit)                                FIVEWORDINLINE(0x2F3C, 0x0014, 0x0013, 0x7000, 0xA82A);
  360.  
  361. EXTERN_API( ComponentResult )
  362. ImageCodecNewImageBufferMemory    (ComponentInstance         ci,
  363.                                  CodecDecompressParams * params,
  364.                                  long                     flags,
  365.                                  ICMMemoryDisposedUPP     memoryGoneProc,
  366.                                  void *                    refCon)                                FIVEWORDINLINE(0x2F3C, 0x0010, 0x0014, 0x7000, 0xA82A);
  367.  
  368. EXTERN_API( ComponentResult )
  369. ImageCodecExtractAndCombineFields (ComponentInstance     ci,
  370.                                  long                     fieldFlags,
  371.                                  void *                    data1,
  372.                                  long                     dataSize1,
  373.                                  ImageDescriptionHandle  desc1,
  374.                                  void *                    data2,
  375.                                  long                     dataSize2,
  376.                                  ImageDescriptionHandle  desc2,
  377.                                  void *                    outputData,
  378.                                  long *                    outDataSize,
  379.                                  ImageDescriptionHandle  descOut)                            FIVEWORDINLINE(0x2F3C, 0x0028, 0x0015, 0x7000, 0xA82A);
  380.  
  381. EXTERN_API( ComponentResult )
  382. ImageCodecGetMaxCompressionSizeWithSources (ComponentInstance  ci,
  383.                                  PixMapHandle             src,
  384.                                  const Rect *            srcRect,
  385.                                  short                     depth,
  386.                                  CodecQ                 quality,
  387.                                  CDSequenceDataSourcePtr  sourceData,
  388.                                  long *                    size)                                FIVEWORDINLINE(0x2F3C, 0x0016, 0x0016, 0x7000, 0xA82A);
  389.  
  390.  
  391. /* selectors for component calls */
  392. enum {
  393.     kImageCodecGetCodecInfoSelect                    = 0x0000,
  394.     kImageCodecGetCompressionTimeSelect                = 0x0001,
  395.     kImageCodecGetMaxCompressionSizeSelect            = 0x0002,
  396.     kImageCodecPreCompressSelect                    = 0x0003,
  397.     kImageCodecBandCompressSelect                    = 0x0004,
  398.     kImageCodecPreDecompressSelect                    = 0x0005,
  399.     kImageCodecBandDecompressSelect                    = 0x0006,
  400.     kImageCodecBusySelect                            = 0x0007,
  401.     kImageCodecGetCompressedImageSizeSelect            = 0x0008,
  402.     kImageCodecGetSimilaritySelect                    = 0x0009,
  403.     kImageCodecTrimImageSelect                        = 0x000A,
  404.     kImageCodecRequestSettingsSelect                = 0x000B,
  405.     kImageCodecGetSettingsSelect                    = 0x000C,
  406.     kImageCodecSetSettingsSelect                    = 0x000D,
  407.     kImageCodecFlushSelect                            = 0x000E,
  408.     kImageCodecSetTimeCodeSelect                    = 0x000F,
  409.     kImageCodecIsImageDescriptionEquivalentSelect    = 0x0010,
  410.     kImageCodecNewMemorySelect                        = 0x0011,
  411.     kImageCodecDisposeMemorySelect                    = 0x0012,
  412.     kImageCodecHitTestDataSelect                    = 0x0013,
  413.     kImageCodecNewImageBufferMemorySelect            = 0x0014,
  414.     kImageCodecExtractAndCombineFieldsSelect        = 0x0015,
  415.     kImageCodecGetMaxCompressionSizeWithSourcesSelect = 0x0016
  416. };
  417.  
  418.  
  419.  
  420. enum {
  421.     kMotionJPEGTag                = FOUR_CHAR_CODE('mjpg')
  422. };
  423.  
  424. struct MotionJPEGApp1Marker {
  425.     long                             unused;
  426.     long                             tag;
  427.     long                             fieldSize;
  428.     long                             paddedFieldSize;
  429.     long                             offsetToNextField;
  430.     long                             qTableOffset;
  431.     long                             huffmanTableOffset;
  432.     long                             sofOffset;
  433.     long                             sosOffset;
  434.     long                             soiOffset;
  435. };
  436. typedef struct MotionJPEGApp1Marker MotionJPEGApp1Marker;
  437.  
  438.  
  439. EXTERN_API( ComponentResult )
  440. QTPhotoSetSampling                (ComponentInstance         codec,
  441.                                  short                     yH,
  442.                                  short                     yV,
  443.                                  short                     cbH,
  444.                                  short                     cbV,
  445.                                  short                     crH,
  446.                                  short                     crV)                                FIVEWORDINLINE(0x2F3C, 0x000C, 0x0100, 0x7000, 0xA82A);
  447.  
  448. EXTERN_API( ComponentResult )
  449. QTPhotoSetRestartInterval        (ComponentInstance         codec,
  450.                                  unsigned short         restartInterval)                    FIVEWORDINLINE(0x2F3C, 0x0002, 0x0101, 0x7000, 0xA82A);
  451.  
  452. EXTERN_API( ComponentResult )
  453. QTPhotoDefineHuffmanTable        (ComponentInstance         codec,
  454.                                  short                     componentNumber,
  455.                                  Boolean                 isDC,
  456.                                  unsigned char *        lengthCounts,
  457.                                  unsigned char *        values)                                FIVEWORDINLINE(0x2F3C, 0x000C, 0x0102, 0x7000, 0xA82A);
  458.  
  459. EXTERN_API( ComponentResult )
  460. QTPhotoDefineQuantizationTable    (ComponentInstance         codec,
  461.                                  short                     componentNumber,
  462.                                  unsigned char *        table)                                FIVEWORDINLINE(0x2F3C, 0x0006, 0x0103, 0x7000, 0xA82A);
  463.  
  464.  
  465. /* selectors for component calls */
  466. enum {
  467.     kQTPhotoSetSamplingSelect                        = 0x0100,
  468.     kQTPhotoSetRestartIntervalSelect                = 0x0101,
  469.     kQTPhotoDefineHuffmanTableSelect                = 0x0102,
  470.     kQTPhotoDefineQuantizationTableSelect            = 0x0103
  471. };
  472.  
  473. /* UPP call backs */
  474.  
  475.  
  476. #if PRAGMA_STRUCT_ALIGN
  477.     #pragma options align=reset
  478. #elif PRAGMA_STRUCT_PACKPUSH
  479.     #pragma pack(pop)
  480. #elif PRAGMA_STRUCT_PACK
  481.     #pragma pack()
  482. #endif
  483.  
  484. #ifdef PRAGMA_IMPORT_OFF
  485. #pragma import off
  486. #elif PRAGMA_IMPORT
  487. #pragma import reset
  488. #endif
  489.  
  490. #ifdef __cplusplus
  491. }
  492. #endif
  493.  
  494. #endif /* __IMAGECODEC__ */
  495.  
  496.